// @ts-ignore
/* eslint-disable */
import request from '@/utils/request';

export interface ApifoxModel {
  /**
   * -2.0 和 2.0 之间的数字。正值会根据新标记在文本中的现有频率对其进行惩罚，从而降低模型逐字重复同一行的可能性。
   */
  frequency_penalty?: number;
  /**
   * 修改指定标记出现在完成中的可能性。 接受一个 json 对象，该对象将标记（由标记器中的标记 ID 指定）映射到从 -100 到 100
   * 的关联偏差值。从数学上讲，偏差会在采样之前添加到模型生成的 logits 中。确切的效果因模型而异，但 -1 和 1 之间的值应该会减少或增加选择的可能性；像 -100 或
   * 100 这样的值应该导致相关令牌的禁止或独占选择。
   */
  logit_bias?: null;
  /**
   * 最大回复, 聊天完成时生成的最大Tokens数量。 输入标记和生成标记的总长度受模型上下文长度的限制。
   */
  max_tokens?: number;
  messages: Message[];
  /**
   * 模型名称
   */
  model: string;
  /**
   * 为每个输入消息生成多少个聊天完成选项。
   */
  n?: number;
  /**
   * -2.0 和 2.0 之间的数字。正值会根据到目前为止是否出现在文本中来惩罚新标记，从而增加模型谈论新主题的可能性。
   */
  presence_penalty?: number;
  /**
   * 流式输出, 流式输出或非流式输出
   */
  stream?: boolean;
  /**
   * 温度, 使用什么采样温度，介于 0 和 2 之间。较高的值（如 0.8）将使输出更加随机，而较低的值（如 0.2）将使输出更加集中和确定。
   * 我们通常建议改变这个或`top_p`但不是两者同时使用。
   */
  temperature?: number;
  /**
   * 一种替代温度采样的方法，称为核采样，其中模型考虑具有 top_p 概率质量的标记的结果。所以 0.1 意味着只考虑构成前 10% 概率质量的标记。
   * 我们通常建议改变这个或`temperature`但不是两者同时使用。
   */
  top_p?: number;
  /**
   * 代表您的最终用户的唯一标识符，可以帮助 OpenAI
   * 监控和检测滥用行为。[了解更多](https://platform.openai.com/docs/guides/safety-best-practices/end-user-ids)
   */
  user?: string;

  [property: string]: any;
}

export interface Message {
  /**
   * 提问消息
   */
  content: string;
  /**
   * 角色 system | user
   */
  role: string;

  [property: string]: any;
}

/** chatWithGPT POST /api/chat/gpt */
export async function chatWithGptUsingPost(
  body: {
    prompt: string;
    model?: string;
    temperature?: number;
    max_tokens?: number;
    frequency_penalty?: number;
    presence_penalty?: number;
    stream?: boolean;
    top_p?: number;
  },
  options?: { [key: string]: any }
) {
  const messages: Message[] = [
    {
      role: 'system',
      content:
        '作为一名系统功能介绍助手，你的任务是专门介绍和解答关于"快速开发中后台管理系统"的功能和使用方法。你应该熟悉系统的所有主要功能，包括但不限于：用户管理、权限管理、签到功能、数据统计、公告管理、文件管理等。回答用户问题时，请遵循以下规则：1. 只回答与系统功能、使用方法和系统介绍相关的问题 2. 提供简洁明了的步骤说明，帮助用户理解如何使用各项功能 3. 使用友好、专业的语气 4. 如果不确定某个功能的具体细节，可以提供该功能的一般性描述 5. 回答中可以提及系统的主要模块：工作台、用户签到、数据统计、个人中心、系统管理等 6. 当被问及系统介绍时，可以提及这是一款开箱即用、功能丰富的中后台管理系统框架。你不应该：1. 回答与系统无关的问题 2. 提供技术实现细节或代码解释 3. 讨论系统的安全漏洞或潜在问题 4. 编造不存在的功能。请始终保持专业、有帮助的态度，专注于帮助用户了解和使用系统的各项功能。'
    },
    {
      role: 'user',
      content: body.prompt
    }
  ];

  // 使用完整URL绕过baseURL设置
  return request<API.BaseResponseString_>(
    'http://localhost:8000/api/gpt/chat/completions',
    {
      method: 'POST',
      headers: {
        'Authorization':
          'Bearer sk-tu6meQCVueBpj1PF210bA83f774644399e67678b75D66cBd',
        'Content-Type': 'application/json'
      },
      data: {
        messages,
        model: body.model || 'gpt-3.5-turbo',
        temperature: body.temperature || 0.7,
        max_tokens: body.max_tokens || 1000,
        frequency_penalty: body.frequency_penalty,
        presence_penalty: body.presence_penalty,
        stream: body.stream,
        top_p: body.top_p
      },
      ...(options || {})
    }
  );
}
